package com.test.resource;

import com.test.util.ClassUtils;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * 默认的资源加载器实现类
 * 用于加载类路径或文件系统中的资源
 */
public class DefaultResourceLoader implements ResourceLoader{

    // 类加载器，用于加载资源
    private ClassLoader classLoader;

    /**
     * 默认构造函数
     * 初始化时使用默认的类加载器
     */
    public DefaultResourceLoader() {
        this.classLoader = ClassUtils.getDefaultClassLoader();
    }

    /**
     * 构造函数
     * @param classLoader 自定义类加载器
     */
    public DefaultResourceLoader(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }

    /**
     * 根据资源路径获取资源
     * 首先判断资源路径是否为空，如果为空则抛出异常
     * 如果路径以"classpath:"开头，则使用类路径资源加载器加载资源
     * 否则尝试使用URL加载资源，如果URL格式错误，则使用文件系统资源加载器加载资源
     *
     * @param location 资源路径
     * @return 加载的资源
     * @throws IllegalArgumentException 如果资源路径为空
     * @throws MalformedURLException 如果URL格式错误
     */
    @Override
    public Resource getResource(String location) {
        if (location == null || location.isEmpty()){
            throw new IllegalArgumentException("资源路径不能为空");
        }
        if (location.startsWith(CLASSPATH_URL_PREFIX)) {
            // 加载classpath资源
            return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
        }

        try{
            URL url = new URL(location);
            return new UrlResource(location);
        }catch (MalformedURLException ex){
            return new FileSystemResource(location);
        }
    }

    /**
     * 获取类加载器
     * 如果未设置类加载器，则返回默认的类加载器
     *
     * @return 类加载器
     */
    @Override
    public ClassLoader getClassLoader() {
        return (this.classLoader != null ? this.classLoader : ClassUtils.getDefaultClassLoader());
    }

    /**
     * 设置类加载器
     *
     * @param classLoader 类加载器
     */
    public void setClassLoader(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }
}
